package com.dj.mingkong.admin.biz.repository.database.music;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dj.mingkong.admin.biz.controller.music.vo.request.AlbumQueryVo;
import com.dj.mingkong.admin.biz.util.WrapperUtil;
import com.dj.mingkong.common.constant.CommonConstants;
import com.dj.mingkong.common.enums.StatusEnum;
import com.dj.mingkong.common.infrastructure.base.dto.query.QueryVo;
import com.dj.mingkong.common.infrastructure.base.eo.BaseEo;
import com.dj.mingkong.common.infrastructure.base.repository.BaseDatabaseRepository;
import com.dj.mingkong.common.infrastructure.eo.database.music.AlbumEo;
import com.dj.mingkong.admin.biz.repository.database.music.mapper.AlbumMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;

import java.util.Arrays;
import java.util.List;


/**
 * 专辑Repository
 *
 * @author zenglonghui
 * @date: 2022/5/17 19:08
 */
@Repository
public class AlbumRepository extends BaseDatabaseRepository<AlbumMapper, AlbumEo, QueryVo> {
    @Override
    public Wrapper<AlbumEo> buildQuery(AlbumEo albumEo) {
        if (albumEo == null) {
            return null;
        }
        LambdaQueryWrapper<AlbumEo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(albumEo.getId() != null, AlbumEo::getId, albumEo.getId())
                .like(StringUtils.isNotBlank(albumEo.getName()), AlbumEo::getName, albumEo.getName())
                .eq(albumEo.getStatus() != null, AlbumEo::getStatus, albumEo.getStatus())
                .like(StringUtils.isNotBlank(albumEo.getDescription()), AlbumEo::getDescription, albumEo.getDescription())
                .orderByDesc(AlbumEo::getCreateTime);
        return queryWrapper;
    }

    public boolean existByName(String name) {
        return lambdaQuery().eq(AlbumEo::getName, name).exists();
    }

    public Page<AlbumEo> listPageByVo(AlbumQueryVo queryVo) {
        final QueryWrapper<AlbumEo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().like(StringUtils.isNotBlank(queryVo.getName()),
                        AlbumEo::getName, queryVo.getName())
                .in(StringUtils.isNotBlank(queryVo.getStatus()), AlbumEo::getStatus,
                        Arrays.asList(queryVo.getStatus().split(CommonConstants.SPLIT_COMMA)))
                .in(StringUtils.isNotBlank(queryVo.getGenStatus()), AlbumEo::getGenStatus,
                        Arrays.asList(queryVo.getGenStatus().split(CommonConstants.SPLIT_COMMA)));
        WrapperUtil.buildSort(queryWrapper, queryVo.getSort());
        return listPage(queryWrapper, queryVo.getPage(), queryVo.getPageSize());
    }

    public int countByIds(List<Long> ids) {
        return Math.toIntExact(lambdaQuery()
                .in(BaseEo::getId, ids)
                .eq(AlbumEo::getStatus, StatusEnum.VALID.getIntVal())
                .count());
    }
}
